#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>//umask接口头文件
#include<fcntl.h>//O_CREATE,这些宏函数的头文件
int main()
{
    umask(0);//不影响系统默认设置的文件掩码0002

    int fd = open("./bite",O_CREAT|O_RDWR,0666);//以创建/读写的形式的打开（满足没有bite文件就创建出一个bite文件）
    if(fd<0)
    {
        perror("open fail");
        return 1;
    }

    const char* data = "I like Linux!\n";
    
    //写入
    ssize_t ret = write(fd, data,strlen(data));
    if(ret<0)
    {
        perror("write fail");
        return 1;
    }
    lseek(fd,0,SEEK_SET);

    //读取
    char buf[1024]={0};

    ret = read(fd,buf,1023);

    if(ret<0)
    {
        perror("read fail");
        return 1;
    }
    else if(ret==0)
    {
        printf("end of file!");//判断是否读取到了文件末尾
        return 1;
    }

    printf("%s",buf);
    close(fd);












    //close(1);//将stdout关掉了，所以运行程序，显示器不会显示任何东西

    //umask(0);

    ////int fd = open("log.txt",O_WRONLY | O_CREAT |O_TRUNC, 0666);
    //int fd = open("log.txt",O_RDONLY);

    //if(fd<0)
    //{
    //    perror("open fail");
    //    return 1;
    //}
    //dup2(fd,0);//输入重定向:现在fd_array数组下标为0的位置的文件指针指向log.txt文件
    ////也就是说stdin(键盘输入被关闭)，输出的是log.txt文件中的内容

    //char line[64];

    //while(1)
    //{
    //    printf(">");
    //    if(fgets(line,sizeof(line),stdin)==NULL) break;//stdin->0
    //    printf("%s",line);
    //}
    ////printf("open fd: %d\n",fd);//printf -> stdout
    ////fprintf(stdout,"open fd: %d\n",fd);//fprintf -> stdout
    //
    ////const char* msg="hello world";
    ////write(1,msg,strlen(msg));




    //fflush(stdout);

    //close(fd);












    //umask-set file mode creation mask修改文件掩码
    //#include<sys/tyeps.h>
    //#include<sys/stat.h>
    //mode_t umask(mode_t mask)
    //umask(0);//系统默认设置的文件掩码是0002,这里将其清除，设置为0，当前进程重新设置文件掩码

    //int open(const char* pathname,int flags,mode_t mode);
    //open函数打开文件成功时数组当中的指针个数增加，然后将该指针在数组当中的下标进行返回，打开文件失败返回-1
    
    //int fd1=open("log1.txt",O_RDONLY | O_CREAT, 0666);
    //int fd2=open("log2.txt",O_RDONLY | O_CREAT, 0666);
    //int fd3=open("log3.txt",O_RDONLY | O_CREAT, 0666);
    //int fd4=open("log4.txt",O_RDONLY | O_CREAT, 0666);
    //int fd5=open("log5.txt",O_RDONLY | O_CREAT, 0666);

    //open的返回值是文件标识符，默认从3开始，0,1,2分别被stdin(输入：键盘)，stdout(输出：显示器)，stderr(显示器)占用
    //我们知道，当一个程序运行起来时，操作系统会将该程序的代码和数据加载到内存，然后创建PCB
    //task_struct.mm_struct,页表等相关数据结构。而task_struct当中有一个指针，该指针指向一个
    //名为files_struct的结构体，该结构体中就有一个struct file* fd_array的指针数组，该数组下标就是文件描述符
    //数组的指针分别存储文件的地址，指向进程中每个被打开的文件,0,1,2默认指向stdin.stdout,stderr
    
    //printf("fd1:%d\n",fd1);
    //printf("fd2:%d\n",fd2);
    //printf("fd3:%d\n",fd3);
    //printf("fd4:%d\n",fd4);
    //printf("fd5:%d\n",fd5);

    return 0;
}
